﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using Basicas.Utils;
using Basicas;

namespace ProjetoJornada_DAL.Repositorio
{
    public class RepInstrutor_Monitor
    {
        private DAO dao;

        
        public RepInstrutor_Monitor()
        {
            this.dao = DAO.Instance;
        }

        #region Metodos
        public Boolean Inserir(Instrutor_Monitor instrutor_monitor)
        {
            String storeProcedure1 = "sp_InstrutorMonitor_Inserir";
            String storeProcedure2 = "sp_PessoaEndereco_Select_Cpf";
            String storeProcedure3 = "sp_PessoaEndereco_Inserir";
            String storeProcedure4 = "sp_PessoaEndereco_Edit";
            MySqlDataReader dr = null;

            try
            {
                MySqlParameter[] parametros = new MySqlParameter[12];

                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"cpfIn";
                parametros[0].Value = instrutor_monitor.Cpf;
                parametros[0].DbType = System.Data.DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"nomeIn";
                parametros[1].Value = instrutor_monitor.Nome;
                parametros[1].DbType = System.Data.DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"emailIn";
                parametros[2].Value = instrutor_monitor.Email;
                parametros[2].DbType = System.Data.DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"telefoneIn";
                parametros[3].Value = instrutor_monitor.Telefone;
                parametros[3].DbType = System.Data.DbType.String;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"celularIn";
                parametros[4].Value = instrutor_monitor.Celular;
                parametros[4].DbType = System.Data.DbType.String;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"cidadeIn";
                parametros[5].Value = instrutor_monitor.Cidade;
                parametros[5].DbType = System.Data.DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"bairroIn";
                parametros[6].Value = instrutor_monitor.Bairro;
                parametros[6].DbType = System.Data.DbType.String;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"ruaIn";
                parametros[7].Value = instrutor_monitor.Rua;
                parametros[7].DbType = System.Data.DbType.String;

                parametros[8] = new MySqlParameter();
                parametros[8].ParameterName = @"numeroIn";
                parametros[8].Value = instrutor_monitor.Numero;
                parametros[8].DbType = System.Data.DbType.Int32;

                parametros[9] = new MySqlParameter();
                parametros[9].ParameterName = @"complementoIn";
                parametros[9].Value = instrutor_monitor.Complemento;
                parametros[9].DbType = System.Data.DbType.String;

                parametros[10] = new MySqlParameter();
                parametros[10].ParameterName = @"ufIn";
                parametros[10].Value = instrutor_monitor.Uf;
                parametros[10].DbType = System.Data.DbType.String;

                parametros[11] = new MySqlParameter();
                parametros[11].ParameterName = @"rgIn";
                parametros[11].Value = instrutor_monitor.Rg;
                parametros[11].DbType = System.Data.DbType.String;

                //Tabela Instrutor-Monitor
                MySqlParameter[] parametros2 = new MySqlParameter[4];
                parametros2[0] = new MySqlParameter();
                parametros2[0].ParameterName = @"cpfIn";
                parametros2[0].Value = instrutor_monitor.Rg;
                parametros2[0].DbType = System.Data.DbType.String;

                parametros2[1] = new MySqlParameter();
                parametros2[1].ParameterName = @"valorContratoIn";
                parametros2[1].Value = instrutor_monitor.ValorContrato;
                parametros2[1].DbType = System.Data.DbType.Double;

                parametros2[2] = new MySqlParameter();
                parametros2[2].ParameterName = @"curriculoIn";
                parametros2[2].Value = instrutor_monitor.Curriculo;
                parametros2[2].DbType = System.Data.DbType.String;            

                parametros2[3] = new MySqlParameter();
                parametros2[3].ParameterName = @"ehInstrutorIn";
                parametros2[3].Value = instrutor_monitor.EhInstrutor;
                parametros2[3].DbType = System.Data.DbType.Boolean;

                MySqlParameter[] parametros3 = new MySqlParameter[1];
                parametros3[0] = new MySqlParameter();
                parametros3[0].ParameterName = @"cpfIn";
                parametros3[0].Value = instrutor_monitor.Cpf;
                parametros3[0].DbType = System.Data.DbType.String;

                dr = dao.ExecutaLeituraProcedure(parametros3, storeProcedure2);

                if (dr.Read())
                {
                    dao.FecharConexao();
                    dao.ExecutaSql(parametros2, storeProcedure1);
                    dao.FecharConexao();
                    return dao.ExecutaSql(parametros, storeProcedure4);
                }
                else
                {
                    dao.FecharConexao();
                    dao.ExecutaSql(parametros, storeProcedure3);
                    dao.FecharConexao();
                    return dao.ExecutaSql(parametros2, storeProcedure1);                    
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "inserirInstrutor_Monitor");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
                if (dr != null)
                {
                    dr.Close();
                }
            }
        }

        public Boolean Remover(String cpf)
        {
            String storeProcedure = "sp_InstrutorMonitor_Delete";

            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"cpfInstrutorMonitor";
                parametros[0].Value = cpf;
                parametros[0].DbType = System.Data.DbType.String;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "deleteInstrutorMonitor");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
        }

        public Boolean Editar(Instrutor_Monitor instrutorMonitor) 
        {
            MySqlParameter[] parametros = new MySqlParameter[15];
            String storeProcedure = "sp_InstrutorMonitor_Edit";

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"cpfIn";
                parametros[0].Value = instrutorMonitor.Cpf;
                parametros[0].DbType = System.Data.DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"rgIn";
                parametros[1].Value = instrutorMonitor.Rg;
                parametros[1].DbType = System.Data.DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"nomeIn";
                parametros[2].Value = instrutorMonitor.Nome;
                parametros[2].DbType = System.Data.DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"emailIn";
                parametros[3].Value = instrutorMonitor.Email;
                parametros[3].DbType = System.Data.DbType.String;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"telefoneIn";
                parametros[4].Value = instrutorMonitor.Telefone;
                parametros[4].DbType = System.Data.DbType.String;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"celularIn";
                parametros[5].Value = instrutorMonitor.Celular;
                parametros[5].DbType = System.Data.DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"cidadeIn";
                parametros[6].Value = instrutorMonitor.Cidade;
                parametros[6].DbType = System.Data.DbType.String;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"bairroIn";
                parametros[7].Value = instrutorMonitor.Bairro;
                parametros[7].DbType = System.Data.DbType.String;

                parametros[8] = new MySqlParameter();
                parametros[8].ParameterName = @"ruaIn";
                parametros[8].Value = instrutorMonitor.Rua;
                parametros[8].DbType = System.Data.DbType.String;

                parametros[9] = new MySqlParameter();
                parametros[9].ParameterName = @"numeroIn";
                parametros[9].Value = instrutorMonitor.Numero;
                parametros[9].DbType = System.Data.DbType.Int32;

                parametros[10] = new MySqlParameter();
                parametros[10].ParameterName = @"complementoIn";
                parametros[10].Value = instrutorMonitor.Complemento;
                parametros[10].DbType = System.Data.DbType.String;

                parametros[11] = new MySqlParameter();
                parametros[11].ParameterName = @"ufIn";
                parametros[11].Value = instrutorMonitor.Uf;
                parametros[11].DbType = System.Data.DbType.String;

                parametros[12] = new MySqlParameter();
                parametros[12].ParameterName = @"valorIn";
                parametros[12].Value = instrutorMonitor.ValorContrato;
                parametros[12].DbType = System.Data.DbType.Double;

                parametros[13] = new MySqlParameter();
                parametros[13].ParameterName = @"curriculoIn";
                parametros[13].Value = instrutorMonitor.Curriculo;
                parametros[13].DbType = System.Data.DbType.String;

                parametros[14] = new MySqlParameter();
                parametros[14].ParameterName = @"ehInstrutorIn";
                parametros[14].Value = instrutorMonitor.EhInstrutor;
                parametros[14].DbType = System.Data.DbType.Boolean;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarInstrutorMonitor");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
        }

        public Instrutor_Monitor ConsultarInstrutorMonitorPorCPF(String cpf)
        {
            String storeProcedure = "sp_InstrutorMonitor_Select_CPF";
            MySqlDataReader dado = null;

            MySqlParameter[] parametros = new MySqlParameter[1];

            parametros[0] = new MySqlParameter();
            parametros[0].ParameterName = @"cpf";
            parametros[0].Value = cpf;
            parametros[0].DbType = System.Data.DbType.String;

            Instrutor_Monitor instrutorMonitor = null;

            try
            {
                dado = dao.ExecutaLeituraProcedure(parametros, storeProcedure);
                
                if (dado.Read())
                {
                    int numero = dado.GetInt32("Numero");
                    double valorContrato = dado.GetDouble("ValorContrato");
                    string uf = dado["UF"] as string;
                    string rg = dado["RG"] as string;
                    bool ehInstrutor = dado.GetBoolean("eh_Instrutor");
                    string curriculo = dado["Curriculo"] as string;
                    string nome = dado["Nome"] as string;
                    string email = dado["Email"] as string;
                    string telefone = dado["Telefone"] as string;
                    string celular = dado["Celular"] as string;
                    string cidade = dado["Cidade"] as string;
                    string complemento = dado["Complemento"] as string;
                    string bairro = dado["Bairro"] as string;
                    string rua = dado["Rua"] as string;

                    instrutorMonitor = new Instrutor_Monitor(cpf, rg, nome, email, telefone, celular, cidade, bairro, rua, numero, complemento, uf, valorContrato, curriculo, ehInstrutor);
                }
                return instrutorMonitor;
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "GetInstrutorMonitorPorCPF - Repositório");
                throw ex;
            }
            finally
            {
                if (dado != null)
                {
                    dado.Close();
                }

                dao.FecharConexao();
            }
        }

        public List<Instrutor_Monitor> GetInstrutorMonitorPorNome(String nome)
        {
            List<Instrutor_Monitor> lista = new List<Instrutor_Monitor>();

            String storeProcedure = "sp_InstrutorMonitor_Select_Nome";

            MySqlDataReader dado = null;

            MySqlParameter[] parametros = new MySqlParameter[1];

            parametros[0] = new MySqlParameter();
            parametros[0].ParameterName = @"nome";
            parametros[0].Value = nome;
            parametros[0].DbType = System.Data.DbType.String;

            try
            {
                dado = dao.ExecutaLeituraProcedure(parametros, storeProcedure);

                while (dado.Read())
                {
                    lista.Add(CarregarInstrutorMonitor(dado));
                }

                return lista;
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "GetInstrutorMonitorPorNome - Repositório");
                throw ex;
            }

        }

        public List<Instrutor_Monitor> GetTodosInstrutorMonitor()
        {
            List<Instrutor_Monitor> retorno = new List<Instrutor_Monitor>();

            String storeProcedure = "sp_InstrutorMonitor_Select_All";
            MySqlDataReader dado = null;
            try
            {
                dado = dao.ExecutaLeituraProcedure(storeProcedure);

                while (dado.Read())
                {
                    retorno.Add(CarregarInstrutorMonitor(dado));
                }

                return retorno;
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "GetTodosInstrutorMonitor - Repositório");
                throw ex;
            }
            finally
            {
                if (dado != null)
                {
                    dado.Close();
                }

                dao.FecharConexao();            
            }

        }

        private Instrutor_Monitor CarregarInstrutorMonitor(MySqlDataReader dado)
        {
            string cpf = dado["CPF"] as string;
            double valorContrato = 0;

            if (dado["ValorContrato"] != null)
                valorContrato = dado.GetDouble("ValorContrato");

            bool ehInstrutor = dado.GetBoolean("eh_Instrutor");
            string curriculo = dado["Curriculo"] as string;
            string nome = dado["Nome"] as string;
            string email = dado["Email"] as string;
            string telefone = dado["Telefone"] as string;
            string celular = dado["Celular"] as string;
            string cidade = dado["Cidade"] as string;
            string complemento = dado["Complemento"] as string;
            string bairro = dado["Bairro"] as string;
            string rua = dado["Rua"] as string;

            int numero = 0;
            if(dado["Numero"] != null)
              numero = dado.GetInt32("Numero");

            string uf = dado["UF"] as string;
            string rg = dado["RG"] as string;

            Instrutor_Monitor instrutor_monitor = new Instrutor_Monitor(cpf, rg, nome, email, telefone, celular, cidade, bairro, rua, numero, complemento, uf, valorContrato, curriculo, ehInstrutor);

            return instrutor_monitor;
        }

        #endregion

    }
}
